(* Обертка над HSet, при создании не занимает памяти, создается только при реальном обращении *)

type t 'a = Lazy.t (HSet.t 'a);

value empty () = lazy(HSet.empty());

value add h e = HSet.add (Lazy.force h) e;

value mem h e = HSet.mem (Lazy.force h) e;

value remove h e = HSet.remove (Lazy.force h) e;
value remove_exn h e = HSet.remove_exn (Lazy.force h) e;

value is_empty h = not (Lazy.lazy_is_val h) || HSet.is_empty (Lazy.force h);

value add' h e = if mem h e then False else (add h e; True);

value iter f h = HSet.iter f (Lazy.force h);

value clear h = HSet.clear (Lazy.force h);
